#include <stdio.h>



// 打印二进制字符串
void printBinaryStr(int a) {
    int len = sizeof(a) * 8;
    int all1 = 0xffffffff;
    char str[34] = {0};
    for (int i = 0; i < len; ++i) {
        str[31-i] = ((unsigned)((1 << i) & a) >> i) == 0 ? '0' : '1';
        
    }
    str[32] = '\n';
    printf("int二进制：%s", str);
}

// 打印二进制字符串
void printBinaryStr2(float f) {
    int * intPtr = (int *)&f;
    int a = *intPtr;
    int len = sizeof(a) * 8;
    int all1 = 0xffffffff;
    char str[34] = {0};
    for (int i = 0; i < len; ++i) {
        str[31-i] = ((unsigned)((1 << i) & a) >> i) == 0 ? '0' : '1';
        
    }
    str[32] = '\n';
    printf("float二进制：%s", str);
}



int main() {
    // 使用printf格式化打印二进制字符串，但是%b格式并不是所有编译器都支持。
    printf("使用printf格式化打印二进制字符串87=%b\n", 87);

    float f = 2.0f;
    printBinaryStr2(f);  // 01000000000000000000000000000000

    // c语言风格的显示类型转换，会改变底层存储
    printBinaryStr((int)f);  // 00000000000000000000000000000010

    // c++风格的static_cast，效果和c语言风格的显示类型转换一样，会改变底层存储
    printBinaryStr(static_cast<int>(f));  // 00000000000000000000000000000010

    // c++风格的reintercept_cast，改变数据类型，但是不改变数据底层存储，只是重新解释了类型，用来对指针类型转换
    printBinaryStr(*reinterpret_cast<int*>(&f));  // 01000000000000000000000000000000

    // 总结，c++中的static_cast、reinterpret_cast都是显示类型转换，都可以用c风格的括号显示类型转换替代，
    // 只不是c++风格将显示类型转换更加细分了，增强了代码可读性。

    return 0;
}